Тут вже є відповіді на це питання: Немає неявного перетворення в перевантаженому операторі (2 відповіді) Закрито 7 років тому. Я пишу просту обгортку для елементарного типу, і намагаюся уникати надто багато варіантів стандартних операторів. Я сподівався, що неявне перетворення типу допоможе, але це не так. Ось приклад, що розібрався: struct Int { int _i; Int (int i = 0): _i {i} {} Оператор Int + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (порожнеча) (Int (1) + 2); // Чудово (порожнеча) (2 + Int (1)); // помилка: недійсні операнди до двійкового виразу ('int' та 'Int') } Я використовую llvm. Перший рядок основного компілюється чудово. Другий викликає помилку. Тепер, що я сподівався, що відбудеться у другому рядку, це те, що 2 буде неявно перетворено в Int (2), після чого буде виклик оператора +. Чому цього не відбувається? Чому неявне перетворення відбувається в першому рядку?
2021-03-01 08:20:06
Це трапляється у першому рядку, оскільки єдиним доступним оператором + є оператор + (Int &) (який має неявний перший параметр Int для цього екземпляра). Другий рядок не вдається, оскільки перший параметр - це int, і він не знає, що йому потрібно перетворити його перед спробою операції (він не знає, що йому потрібно використовувати Int :: operator +). Ви можете уникнути цієї проблеми, зробивши оператора функцією друзів, що не є членом (http://ideone.com/YCf7wX) struct Int { int _i; Int (int i = 0): _i {i} {} друг Int оператор + (const Int & lhs, const Int & rhs); }; Оператор Int + (const Int & lhs, const Int & rhs) { повернути lhs._i + rhs._i; } int main () { Int i; i + 5; 5 + i; повернути 0; } | Не відповідь, яку ви шукаєте? Перегляньте інші запитання, позначені тегом c ++ operator-keyword implicit-conversion, або задайте власне запитання.